home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 051-075 / disk_055 / screensave / screensave.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  10KB  |  389 lines

  1. /***************************************************************************
  2. *  ScreenSave.c --  Save front screen as ILBM file
  3. *                   Saves a CAMG chunk for Amiga ViewModes
  4. *                   by Carolyn Scheppner  CBM  10/86
  5. *     Using IFF rtns by J.Morrison and S.Shaw of Electronic Arts
  6. *       (re-compiled with -v on LC2)
  7. * Linkage information:
  8. * FROM     AStartup.obj, ScreenSave.o, iffw.o, ilbmw.o, packer.o
  9. * TO       ScreenSave
  10. * LIBRARY  Amiga.lib, LC.lib
  11. ***************************************************************************/
  12.  
  13. #include <exec/types.h>
  14. #include <exec/memory.h>
  15. #include <libraries/dos.h>
  16. #include <libraries/dosextens.h>
  17. #include <graphics/gfxbase.h>
  18. #include <graphics/rastport.h>
  19. #include <graphics/gfx.h>
  20. #include <graphics/view.h>
  21.  
  22. #include <intuition/intuition.h>
  23. #include <intuition/intuitionbase.h>
  24. #include <workbench/workbench.h>
  25. #include <workbench/startup.h>
  26.  
  27. #include <iff/ilbm.h>
  28.  
  29. /* From AStartup */
  30. extern  LONG  stdin, stdout, stderr;
  31.  
  32. /* CAMG Stuff */
  33. typedef struct {
  34.    ULONG ViewModes;
  35.    } CamgChunk;
  36.  
  37. #define PutCAMG(context, camg)  \
  38.     PutCk(context, ID_CAMG, sizeof(CamgChunk),(BYTE *)camg)
  39.  
  40. #define bufSize 512
  41.  
  42. /* Other Stuff */
  43. struct IntuitionBase *IntuitionBase;
  44. struct GfxBase       *GfxBase;
  45. ULONG  IconBase;
  46.  
  47. struct Screen   *frontScreen;
  48.  
  49. struct ViewPort *picViewPort;
  50. struct BitMap   *picBitMap;
  51. WORD            *picColorTable;
  52. ULONG            picViewModes;
  53. BOOL fromWB, newStdio;
  54.  
  55. #define INBUFSZ 40
  56. char sbuf[INBUFSZ];
  57. char nbuf[INBUFSZ];
  58.  
  59. char conSpec[] = "CON:0/40/639/160/ SaveScreen ";
  60.  
  61. /* Definitions for ILBM Icon */
  62. USHORT  ILBMimagedata[] = {
  63.  0xFFFF, 0xFFFC,
  64.  0xC000, 0x000C,
  65.  0xC000, 0x000C,
  66.  0xC1E7, 0x9E0C,
  67.  0xC1F8, 0x7E0C,
  68.  0xC078, 0x780C,
  69.  0xC187, 0x860C,
  70.  0xC078, 0x780C,
  71.  0xC1F8, 0x7E0C,
  72.  0xC1E7, 0x9E0C,
  73.  0xC000, 0x000C,
  74.  0xC000, 0x000C,
  75.  0xFFFF, 0xFFFC,
  76.  0x0000, 0x0000,
  77.  0x0000, 0x0000,
  78. /**/
  79.  0xFFFF, 0xFFFC,
  80.  0xFFFF, 0xFFFC,
  81.  0xF800, 0x007C,
  82.  0xF9E0, 0x1E7C,
  83.  0xF980, 0x067C,
  84.  0xF807, 0x807C,
  85.  0xF81F, 0xE07C,
  86.  0xF807, 0x807C,
  87.  0xF980, 0x067C,
  88.  0xF9E0, 0x1E7C,
  89.  0xF800, 0x007C,
  90.  0xFFFF, 0xFFFC,
  91.  0xFFFF, 0xFFFC,
  92.  0x0000, 0x0000,
  93.  0x0000, 0x0000,
  94. /**/
  95.  };
  96.  
  97. struct Image ILBMimage = {
  98.    0,0,                     /* Leftedge, Topedge */
  99.    30,15,                   /* Width Height */
  100.    2,                       /* Depth */
  101.    &ILBMimagedata[0],       /* Data for image */
  102.    3,0                      /* PlanePick, PlaneOnOff */
  103.    };
  104.  
  105. struct DiskObject ILBMobject = {
  106.    WB_DISKMAGIC,
  107.    WB_DISKVERSION,
  108.  
  109.    /* Gadget Structure */
  110.    NULL,                    /* Ptr to next gadget */
  111.    0,0,                     /* Leftedge, Topedge */
  112.    30,15,                   /* Width, Height */
  113.    GADGHBOX|GADGIMAGE,      /* Flags */
  114.    RELVERIFY|GADGIMMEDIATE, /* Activation */
  115.    BOOLGADGET,              /* Type */
  116.    (APTR)&ILBMimage,        /* Render */
  117.    NULL,                    /* Select Render */
  118.    NULL,                    /* Text */
  119.    NULL,NULL,NULL,NULL,     /* Exclude, Special, ID, UserData */
  120.  
  121.    4,                       /* WBObject type */
  122.    ":ViewILBM",             /* Default tool */
  123.    NULL,                    /* Tool Types */
  124.    NO_ICON_POSITION,        /* Current X */
  125.    NO_ICON_POSITION,        /* Current Y */
  126.    NULL,NULL,NULL,          /* Drawer, ToolWindow, Stack */
  127.    };
  128.  
  129.  
  130. main(argc, argv)
  131. int argc;
  132. char **argv;
  133.    {
  134.    LONG            file;
  135.    IFFP            iffp = NO_FILE;
  136.    char            *filename;
  137.    int l;
  138.  
  139.    newStdio = FALSE;
  140.    fromWB = (argc==0) ? TRUE : FALSE;
  141.  
  142.    if((fromWB) && (!(newStdio = openStdio(&conSpec[0]))))
  143.       {
  144.       return(0);
  145.       }
  146.  
  147.    if ((IntuitionBase =
  148.       (struct IntuitionBase *)OpenLibrary("intuition.library",0))==NULL)
  149.          cleanexit("Can't open intuition.library\n");
  150.  
  151.    if ((GfxBase =
  152.       (struct GfxBase *)OpenLibrary("graphics.library",0))==NULL)
  153.       cleanexit("Can't open graphics.library\n");
  154.  
  155.    if ((IconBase = OpenLibrary("icon.library",0))==NULL )
  156.       cleanexit("Can't open icon.library\n");
  157.  
  158.    printf("ScreenSave --- C. Scheppner  CBM  10/86\n");
  159.    printf("   Saves the front screen as an IFF ILBM file\n");
  160.    printf("   A CAMG chunk is saved (for HAM pics, etc.)\n\n");
  161.  
  162.    if(argc>1)                 /* Passed filename via command line  */
  163.       {
  164.       filename = argv[1];
  165.       }
  166.    else
  167.       {
  168.       printf("Enter filename for save: ");
  169.       l = gets(&nbuf[0]);
  170.  
  171.       if(l==0)                /* No filename - Exit */
  172.          {
  173.          cleanexit("\nScreen not saved, filename required\n");
  174.          }
  175.       else
  176.          {
  177.          filename = &nbuf[0];
  178.          }
  179.       }
  180.  
  181.    if (!(file = Open(filename, MODE_NEWFILE)))
  182.       cleanexit("Can't open output file\n");
  183.      
  184.    Write(file,"x",1);  /* 1.1 so Seek to beginning works ? */
  185.  
  186.    printf("Click here and press <RETURN> when ready: ");
  187.    gets(&sbuf[0]);
  188.    printf("Front screen will be saved in 10 seconds\n");
  189.    Delay(500);
  190.  
  191.    Forbid();
  192.    frontScreen  = IntuitionBase->FirstScreen;
  193.    Permit();
  194.  
  195.    picViewPort = &( frontScreen->ViewPort );
  196.    picBitMap = (struct BitMap*)picViewPort->RasInfo->BitMap;
  197.    picColorTable = (WORD *)picViewPort->ColorMap->ColorTable;
  198.    picViewModes = (ULONG)picViewPort->Modes;
  199.  
  200.    printf("\nSaving...\n");
  201.  
  202.    iffp = PutPicture(file, picBitMap, picColorTable, picViewModes);
  203.    Close(file);
  204.  
  205.    if (iffp == IFF_OKAY)
  206.       {
  207.       printf("Screen saved\n");
  208.       if(!(PutDiskObject(filename,&ILBMobject)))
  209.          {
  210.          cleanexit("Error saving icon\n");
  211.          }
  212.       printf("Icon saved\n");
  213.       }
  214.    cleanexit("Done\n");
  215.    }
  216.  
  217.  
  218. cleanexit(s)
  219.    char  *s;
  220.    {
  221.    if(*s) printf(s);
  222.    if ((fromWB)&&(*s))    /* Wait so user can read messages */
  223.       {
  224.       printf("\nPRESS RETURN TO EXIT\n");
  225.       gets(&sbuf[0]);
  226.       }
  227.    cleanup();
  228.    exit();
  229.    }
  230.  
  231. cleanup()
  232.    {
  233.    if (newStdio)  closeStdio();
  234.    if (GfxBase) CloseLibrary(GfxBase);
  235.    if (IntuitionBase) CloseLibrary(IntuitionBase);
  236.    if (IconBase) CloseLibrary(IconBase);
  237.    }
  238.  
  239.  
  240. openStdio(conspec)
  241. char *conspec;
  242.    {
  243.    LONG wfile;
  244.    struct Process *proc;
  245.    struct FileHandle *handle;
  246.  
  247.    if (!(wfile = Open(conspec,MODE_NEWFILE)))  return(0);
  248.    stdin  = wfile;
  249.    stdout = wfile;
  250.    stderr = wfile;
  251.    handle = (struct FileHandle *)(wfile << 2);
  252.    proc = (struct Process *)FindTask(NULL);
  253.    proc->pr_ConsoleTask = (APTR)(handle->fh_Type);
  254.    proc->pr_CIS = (BPTR)stdin;
  255.    proc->pr_COS = (BPTR)stdout;
  256.    return(1);
  257.    }
  258.  
  259. closeStdio()
  260.    {
  261.    struct Process *proc;
  262.    struct FileHandle *handle;
  263.  
  264.    if (stdin > 0)  Close(stdin);
  265.    stdin  = -1;
  266.    stdout = -1;
  267.    stderr = -1;
  268.    handle = (struct FileHandle *)(stdin << 2);
  269.    proc = (struct Process *)FindTask(NULL);
  270.    proc->pr_ConsoleTask = NULL;
  271.    proc->pr_CIS = NULL;
  272.    proc->pr_COS = NULL;
  273.    }
  274.  
  275.  
  276. gets(s)
  277. char *s;
  278.    {
  279.    int l = 0, max = INBUFSZ - 1;
  280.  
  281.    while (((*s = getchar()) !='\n' )&&(l < max)) s++, l++;
  282.    *s = NULL;
  283.    return(l);
  284.    }
  285.  
  286.  
  287. /* String Functions */
  288.  
  289. strlen(s)
  290. char *s;
  291.    {
  292.    int i = 0;
  293.    while(*s++) i++;
  294.    return(i);
  295.    }
  296.  
  297. strcpy(to,from)
  298. char *to, *from;
  299.    {
  300.    do
  301.       {
  302.       *to++ = *from;
  303.       }
  304.    while(*from++);
  305.    }
  306.  
  307.  
  308. /** PutPicture() ***********************************************************
  309.  *
  310.  * Put a picture into an IFF file.
  311.  * This procedure calls PutAnILBM, passing in an <x, y> location of <0, 0>,
  312.  * a NULL mask, and a locally-allocated buffer. It also assumes you want to
  313.  * write out all the bitplanes in the BitMap.
  314.  *
  315.  ***************************************************************************/
  316. Point2D nullPoint = {0, 0};
  317.  
  318. IFFP PutPicture(file, bitmap, colorMap, viewmodes)
  319.       LONG file;  struct BitMap *bitmap;
  320.       WORD *colorMap;  ULONG viewmodes;
  321.    {
  322.    BYTE buffer[bufSize];
  323.    return( PutAnILBM(file, bitmap, NULL,
  324.            colorMap, bitmap->Depth, viewmodes,
  325.            &nullPoint, buffer, bufSize) );
  326.    }    
  327.  
  328.    
  329. /** PutAnILBM() ************************************************************
  330.  *
  331.  * Write an entire BitMap as a FORM ILBM in an IFF file.
  332.  * This version works for any display mode (C. Scheppner).
  333.  *
  334.  * Normal return result is IFF_OKAY.
  335.  *
  336.  * The utility program IFFCheck would print the following outline of the
  337.  * resulting file:
  338.  *
  339.  *   FORM ILBM
  340.  *     BMHD
  341.  *     CAMG
  342.  *     CMAP
  343.  *     BODY       (compressed)
  344.  *
  345.  ***************************************************************************/
  346. #define CkErr(expression)  {if (ifferr == IFF_OKAY) ifferr = (expression);}
  347.  
  348. IFFP PutAnILBM(file, bitmap, mask, colorMap, depth,
  349.                                 viewmodes, xy, buffer, bufsize)
  350.       LONG file;
  351.       struct BitMap *bitmap;
  352.       BYTE *mask;  WORD *colorMap; UBYTE depth;
  353.       ULONG viewmodes;
  354.       Point2D *xy; BYTE *buffer;  LONG bufsize;
  355.    {
  356.    BitMapHeader bmHdr;
  357.    CamgChunk    camgChunk;
  358.    GroupContext fileContext, formContext;
  359.    IFFP ifferr;
  360.    WORD pageWidth, pageHeight;
  361.  
  362.    pageWidth  = (bitmap->BytesPerRow) << 3;
  363.    pageHeight = bitmap->Rows;
  364.  
  365.    ifferr = InitBMHdr(&bmHdr, bitmap, mskNone,
  366.                       cmpByteRun1, 0, pageWidth, pageHeight);
  367.    /* You could write an uncompressed image by passing cmpNone instead
  368.     * of cmpByteRun1 to InitBMHdr. */
  369.    bmHdr.nPlanes = depth;   /* This must be  <= bitmap->Depth */
  370.    if (mask != NULL) bmHdr.masking = mskHasMask;
  371.    bmHdr.x = xy->x;   bmHdr.y = xy->y;
  372.  
  373.    camgChunk.ViewModes = viewmodes;
  374.  
  375.    CkErr( OpenWIFF(file, &fileContext, szNotYetKnown) );
  376.    CkErr(StartWGroup(&fileContext, FORM, szNotYetKnown, ID_ILBM, &formContext));
  377.  
  378.    CkErr( PutBMHD(&formContext, &bmHdr) );
  379.    CkErr( PutCAMG(&formContext, &camgChunk) );
  380.    CkErr( PutCMAP(&formContext, colorMap, depth) );
  381.    CkErr( PutBODY(&formContext, bitmap, mask, &bmHdr, buffer, bufsize) );
  382.  
  383.    CkErr( EndWGroup(&formContext) );
  384.    CkErr( CloseWGroup(&fileContext) );
  385.    return( ifferr );
  386.    }
  387.  
  388.  
  389.